import http from 'wechat-http'

http.baseURL = 'https://live-api.itheima.net'

http.intercept.request = (params) => {
  // 统一携带 token
  const {
    token
  } = getApp()
  // params.header 初始值是 undefined，下面写法会报错的
  // params.header.Authorization = token
  // 下面写法不稳妥，写死了
  // 后续咱们调用其他接口的时候有可能会给 header 传递一些其他信息，下面写法会覆盖传递的 header 信息
  /* params.header = {
    Authorization: token
  } */
  // defaultHeader 自定义的头信息
  const defaultHeader = {}
  if (token) {
    defaultHeader.Authorization = token
  }
  // 将后续有可能传递过来的头信息和 defaulHeader 进行合并，把合并的结果给 params.header
  // 不要放到 if 里面，因为传递过来的头信息是要统一带到后端的，和有没有 token 没有关系
  params.header = Object.assign({}, defaultHeader, params.header)
  return params
}

http.intercept.response = async ({
  statusCode,
  data,
  config
}) => {
  if (statusCode === 401) {
    if (config.url.includes('/refreshToken')) {
      // 这一次的 401 是由于调用刷新 token 的接口的时候，refreshToken 过期导致的
      const currentPages = getCurrentPages()
      const currentPage = currentPages[currentPages.length - 1]
      const redirectURL = currentPage.route
      const isTabBarPage = wx.utils.isTabBarPage(redirectURL)
      // currentPage.route 页面地址
      const routeType = isTabBarPage ? 'switchTab' : 'redirectTo'
      return wx.redirectTo({
        url: `/pages/login/index?redirectUrl=/${redirectURL}&routeType=${routeType}`,
      })
    }
    const app = getApp()
    // token 过期了，用 refreshToken 换取新的 token
    /* const r = await wx.http.post('/refreshToken', {
      header: {
        Authorization: app.refresh_token
      }
    }) */
    if (!app.refresh_token) return
    const {
      data
    } = await wx.http({
      url: '/refreshToken',
      method: 'POST',
      header: {
        Authorization: app.refresh_token
      }
    })
    console.log(data, 8888)
    // r 里面包含了 token 和 refresh_token，只需要再次调用 app.setToken 方法进行存储
    // 这儿碰到了一个问题：死循环
    // 原因：当调用刷新 token 接口的时候一样会 401（可能 refreshToken 也过期了）
    app.setToken(data.token, data.refreshToken)
    // 根据最新的 token，把这一次错误的请求信息重新再发一次
    const allConfig = Object.assign({}, config, {
      header: {
        Authorization: 'Bearer ' + data.token
      }
    })
    return wx.http(allConfig)
  }
  // 数据的脱壳
  return data
}

wx.http = http

export default http